package 中等.模拟;

/**
 * 给你一个下标从 0 开始的字符串数组 garbage ，其中 garbage[i] 表示第 i 个房子的垃圾集合。garbage[i] 只包含字
 * 符 'M' ，'P' 和 'G' ，但可能包含多个相同字符，每个字符分别表示一单位的金属、纸和玻璃。垃圾车收拾 一 单位的任何一种垃圾都需要花费 1 分钟。
 * 同时给你一个下标从 0 开始的整数数组 travel ，其中 travel[i] 是垃圾车从房子 i 行驶到房子 i + 1 需要的分钟数。
 * 城市里总共有三辆垃圾车，分别收拾三种垃圾。每辆垃圾车都从房子 0 出发，按顺序 到达每一栋房子。但它们 不是必须 到达所有的房子。
 * 任何时刻只有 一辆 垃圾车处在使用状态。当一辆垃圾车在行驶或者收拾垃圾的时候，另外两辆车 不能 做任何事情。
 * 请你返回收拾完所有垃圾需要花费的 最少 总分钟数。
 *
 * @ https://leetcode.cn/problems/minimum-amount-of-time-to-collect-garbage/description/?envType=daily-question&envId=2024-05-11
 * @date 2024/05/11
 */
public class 收集垃圾的最少总时间_2391 {

    public static void main(String[] args) {


        System.out.println(garbageCollection(new String[]{"MMM", "PGM", "GP"},
                new int[]{3, 10}));
    }


    /**
     * 分别遍历一次
     * 每个字符需要花费 1 分钟时间，统计全部字符数量
     * 垃圾车分别停在M,P,G最后出现的地方，所以 travel 从 0 到这个路径行驶花费的时间累加就是答案
     */
    public static int garbageCollection(String[] garbage, int[] travel) {
        int mMaxIdx = 0, pMaxIdx = 0, gMaxIdx = 0;
        int minTime = 0;
        for (int i = 0; i < garbage.length; i++) {
            minTime += garbage[i].length();
            for (int j = 0; j < garbage[i].length(); j++) {
                if ('M' == garbage[i].charAt(j)) {
                    mMaxIdx = i;
                } else if ('P' == garbage[i].charAt(j)) {
                    pMaxIdx = i;
                } else {
                    gMaxIdx = i;
                }
            }
        }

        int totalTravel = 0;
        for (int i = 0; i < travel.length; i++) {
            totalTravel += travel[i];
            if (i == mMaxIdx - 1) {
                minTime += totalTravel;
            }
            if (i == pMaxIdx - 1) {
                minTime += totalTravel;
            }
            if (i == gMaxIdx - 1) {
                minTime += totalTravel;
            }
        }
        return minTime;
    }

}
